package com.ztr.conversion.html2pdf;

import com.aspose.words.Document;
import com.aspose.words.SaveFormat;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;

/**
 * <p>
 * Html 转 Pdf 工具类
 * </p>
 */
@Slf4j
public class Html2PdfUtil {


    /**
     * 将HTML字节码转换为PDF字节码。
     * <p>
     * 此方法接收HTML内容的字节码形式，利用Aspose Words库将这些HTML内容转换为PDF格式。
     * 主要适用于在不需展示HTML内容本身的情况下，需要将HTML内容以PDF格式进行保存或传输的场景。
     *
     * @param htmlBytes HTML内容的字节码形式。
     * @return PDF内容的字节码形式。
     * @throws Exception 如果转换过程中发生错误，将抛出异常。
     */
    @SneakyThrows(Exception.class)
    public static byte[] htmlBytes2PdfBytes(byte[] htmlBytes) {
        // 创建一个文档对象，并使用HTML字节码初始化它。
        Document document = new Document(new ByteArrayInputStream(htmlBytes));
        // 创建一个输出流，用于存储转换后的PDF文件。
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        // 将文档保存为PDF格式，输出到指定的输出流中。
        document.save(outputStream, SaveFormat.PDF);
        // 返回转换后的PDF内容的字节码。
        // 返回生成的`pdf`字节码
        return outputStream.toByteArray();
    }


    /**
     * 将HTML字节序列转换为PDF文件。
     * 使用此方法可以将HTML内容直接转换为PDF格式，便于后续的PDF处理或保存。
     *
     * @param htmlBytes   包含HTML内容的字节序列。
     * @param pdfFilePath 生成的PDF文件的路径。
     * @return 返回表示生成的PDF文件的File对象。
     * @throws Exception 如果转换过程中发生错误，将抛出异常。
     */
    @SneakyThrows(Exception.class)
    public static File htmlBytes2PdfFile(byte[] htmlBytes, String pdfFilePath) {
        // 初始化文档对象，将HTML字节序列作为输入。
        Document document = new Document(new ByteArrayInputStream(htmlBytes));
        // 将文档保存为PDF格式，指定保存的文件路径。
        document.save(pdfFilePath, SaveFormat.PDF);
        // 返回表示PDF文件的File对象。
        return new File(pdfFilePath);
    }

}
